package com.atguigu.book.service.impl;

import com.atguigu.book.dao.CartItemDAO;
import com.atguigu.book.pojo.Book;
import com.atguigu.book.pojo.Cart;
import com.atguigu.book.pojo.CartItem;
import com.atguigu.book.pojo.User;
import com.atguigu.book.service.BookService;
import com.atguigu.book.service.CartItemService;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @ClassName: CartItemServiceImpl
 * @Description:
 * @Author: wty
 * @Date: 2022/12/13
 */

public class CartItemServiceImpl implements CartItemService {
    private CartItemDAO cartItemDAO;
    private BookService bookService;

    @Override
    public void addCartItem(CartItem cartItem) {
        cartItemDAO.addCartItem(cartItem);
    }

    @Override
    public void updateCartItemBuyCount(CartItem cartItem) {
        cartItemDAO.updateCartItemBuyCount(cartItem);
    }

    /**
     * @param
     * @return void
     * @description 判断当前用户的购物车中是否有这本书的CartItem, 有就update, 无就add
     * 1.如果当前用户的购物车中已经存在这个图书了，那么将购物车中这本图书的数量+1
     * 2.否则，在我的购物车中新增一个这本图书的CartItem，数量是1
     * @param: cartItem
     * @date 2022/12/13 14:58
     * @author wty
     **/
    @Override
    public void addOrUpdateCartItem(CartItem cartItem, Cart cart) {
        if (null != cart) {
            Map<Integer, CartItem> map = cart.getMap();
            if (null == map) {
                map = new HashMap<>();
            }

            if (map.containsKey(cartItem.getBook().getId())) {
                CartItem cartItemTemp = map.get(cartItem.getBook().getId());
                // 如果当前用户的购物车中已经存在这个图书了，那么将购物车中这本图书的数量+1
                cartItemTemp.setBuyCount(cartItemTemp.getBuyCount() + 1);
                updateCartItemBuyCount(cartItemTemp);
            } else {
                // 否则，在我的购物车中新增一个这本图书的CartItem，数量是1
                addCartItem(cartItem);
            }

        } else {
            // 购物车为空的情况
            addCartItem(cartItem);
        }

    }

    /**
     * @param
     * @return java.util.List<com.atguigu.book.pojo.CartItem>
     * @description 获取指定用户的所有购物车项列表，需要注意方法内部会查询book的详细信息
     * @param: user
     * @date 2022/12/13 17:59
     * @author wty
     **/
    @Override
    public List<CartItem> getCartItemList(User user) {
        List<CartItem> cartItemList = cartItemDAO.getCartItemList(user);
        for (CartItem cartItem : cartItemList) {
            Book book = bookService.getBook(cartItem.getBook().getId());
            cartItem.setBook(book);
            // 此处需要计算小计，执行内部代码让book的price * buyCount
            cartItem.getXj();
        }

        return cartItemList;
    }

    @Override
    public Cart getCart(User user) {
        List<CartItem> cartItemList = getCartItemList(user);
        Map<Integer, CartItem> map = new HashMap<>();
        for (int i = 0; i < cartItemList.size(); i++) {
            map.put(cartItemList.get(i).getBook().getId(), cartItemList.get(i));
        }
        Cart cart = new Cart();
        cart.setMap(map);
        return cart;
    }

    @Override
    public void delCartItem(CartItem cartItem) {
        cartItemDAO.delCartItem(cartItem);
    }
}
